// SVG扫描Web Worker
self.onmessage = function(e) {
  const { svgText, options = {} } = e.data;
  
  try {
    // 在Web Worker中，我们需要使用正则表达式来解析SVG
    // 而不是DOMParser（在Worker中不可用）
    
    // 检查是否为有效的SVG
    if (!svgText.includes('<svg')) {
      throw new Error('无效的SVG文件');
    }
    
    // 使用正则表达式提取SVG元素
    const svgMatch = svgText.match(/<svg[^>]*>([\s\S]*?)<\/svg>/i);
    if (!svgMatch) {
      throw new Error('无法解析SVG内容');
    }
    
    const svgContent = svgMatch[1];
    
    const results = [];
    const batchSize = options.batchSize || 100;
    const isLargeFile = svgText.length > 1000000;
    
    // 定义可绑定的元素类型
    const elementTypes = isLargeFile 
      ? ['text', 'rect', 'circle', 'path', 'g']
      : ['text', 'rect', 'circle', 'path', 'g', 'polygon', 'line'];
    
    // 使用正则表达式提取所有匹配的元素
    const extractElements = (tagName) => {
      const regex = new RegExp(`<${tagName}([^>]*?)(?:\\s+id\\s*=\\s*["']([^"']+)["'])?[^>]*?>(.*?)</${tagName}>`, 'gi');
      const elements = [];
      let match;
      
      while ((match = regex.exec(svgText)) !== null) {
        const fullMatch = match[0];
        const attributes = match[1] || '';
        const id = match[2];
        const content = match[3] || '';
        
        if (id) {
          elements.push({
            tagName: tagName,
            id: id,
            attributes: attributes,
            content: content,
            fullMatch: fullMatch
          });
        }
      }
      
      return elements;
    };
    
    // 计算总元素数量
    let totalElements = 0;
    const allElements = [];
    
    for (const tagName of elementTypes) {
      const elements = extractElements(tagName);
      allElements.push(...elements);
      totalElements += elements.length;
    }
    
    let processedCount = 0;
    
    // 分批处理元素
    for (let i = 0; i < allElements.length; i += batchSize) {
      const batch = allElements.slice(i, i + batchSize);
      
      batch.forEach(elementData => {
        const elementInfo = createElementInfoFromData(elementData);
        if (elementInfo) {
          results.push(elementInfo);
        }
        processedCount++;
      });
      
      // 发送进度更新
      self.postMessage({
        type: 'progress',
        progress: Math.round((processedCount / totalElements) * 100),
        processed: processedCount,
        total: totalElements
      });
      
      // 让出控制权，避免阻塞
      if (i + batchSize < allElements.length) {
        // 使用setTimeout模拟异步处理
        const start = Date.now();
        while (Date.now() - start < 1) {
          // 短暂等待
        }
      }
    }
    
    // 对于小文件，额外扫描没有ID但包含数值的text元素
    if (!isLargeFile) {
      const textRegex = /<text([^>]*?)>(.*?)<\/text>/gi;
      let textMatch;
      
      while ((textMatch = textRegex.exec(svgText)) !== null) {
        const attributes = textMatch[1] || '';
        const content = textMatch[2] || '';
        const text = content.replace(/<[^>]*>/g, '').trim(); // 移除HTML标签
        
        // 检查是否包含ID
        const idMatch = attributes.match(/\s+id\s*=\s*["']([^"']+)["']/i);
        
        if (!idMatch && (
          text.includes('#') || 
          /\d+(\.\d+)?/.test(text) || 
          text.includes('kV') || 
          text.includes('A') ||
          text.includes('MW') ||
          text.includes('Hz')
        )) {
          const generatedId = `auto_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
          
          const elementData = {
            tagName: 'text',
            id: generatedId,
            attributes: attributes,
            content: content,
            fullMatch: textMatch[0]
          };
          
          const elementInfo = createElementInfoFromData(elementData);
          if (elementInfo) {
            results.push(elementInfo);
          }
        }
      }
    }
    
    // 发送最终结果
    self.postMessage({
      type: 'complete',
      results: results,
      total: results.length
    });
    
  } catch (error) {
    self.postMessage({
      type: 'error',
      error: error.message
    });
  }
};

// 创建元素信息对象（从解析的数据）
function createElementInfoFromData(elementData) {
  const id = elementData.id;
  if (!id) return null;
  
  const type = elementData.tagName.toLowerCase();
  const text = elementData.content ? elementData.content.replace(/<[^>]*>/g, '').trim() : '';
  
  // 生成显示名称
  let displayName = '';
  if (text && text.length > 0 && text.length < 50) {
    displayName = text;
  } else if (id.includes('AH') || id.includes('BH')) {
    displayName = id;
  } else {
    displayName = `${type}_${id}`;
  }
  
  return {
    id: id,
    type: type,
    displayName: displayName,
    isBound: false,
    binding: {
      dataSourceId: '',
      pointId: '',
      displayType: 'value'
    }
  };
}
